package com.daiziru.wuyanmall.service.job;

import com.daiziru.wuyanmall.dao.OrdersMapper;
import com.daiziru.wuyanmall.entity.Orders;
import com.daiziru.wuyanmall.service.OrderService;
import com.github.wxpay.sdk.WXPay;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import tk.mybatis.mapper.entity.Example;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 作者：無言
 * 时间：2022/3/22 21:33
 * 描述：永无BUG
 */

@Component//交给SpringBoot容器管理
public class OrderTimeoutCheckJob {

    @Autowired
    private OrdersMapper ordersMapper;
   @Autowired
   private OrderService orderService;

    private WXPay wxPay = new WXPay(new MyPayConfig());

    @Scheduled(cron = "0/1800 * * * * ?") //设置定时任务，每5秒执行一次
    public void checkAndCloseOrders() {

        try{
            //1、查询超过30min订单且订单状态依然是未支付的订单
            Example example = new Example(Orders.class);
            Example.Criteria criteria = example.createCriteria();
            criteria.andEqualTo("status", "1");//订单未支付
            Date time = new Date(System.currentTimeMillis() - 30*60*1000);//time表示当前时间的前30分钟
            criteria.andLessThan("createTime",time);//生成时间小于time,time是当前时间的前30分钟，如果订单的生成时间小于time的话，说明订单的创建已经超过30分钟了
            List<Orders> orders = ordersMapper.selectByExample(example);

            //2、访问微信支付平台接口、确认该订单是否已经最终支付
            /**
             * 因为有可能存在，当用户已经支付完成了，但是由于网络不稳定或者接口的问题，并没有修改数据库中订单的状态，这样子就会出现错误，
             * 所以我们再支付完成后再访问一次微信支付平台，该订单是否已经知否，就可以排除刚才的问题了
             */

            for(int i = 0; i < orders.size(); i++) {
                Orders order = orders.get(i);//每一个订单
                HashMap<String, String> params = new HashMap<>();
                params.put("out_trade_no", order.getOrderId());
                Map<String, String> res = wxPay.orderQuery(params);

                if("SUCCESS".equalsIgnoreCase(res.get("trade_state"))){
                    //2.1、 如果订单已经支付，修改订单的状态为“已支付/代发货”//2.1、 如果订单已经支付，修改订单的状态为“已支付/代发货”
                    Orders updateOrder = new Orders();
                    updateOrder.setOrderId(order.getOrderId());
                    updateOrder.setStatus("2");
                    int i1 = ordersMapper.updateByPrimaryKeySelective(updateOrder);

                } else if("NOTPAY".equalsIgnoreCase(res.get("trade_state"))){
                    //2.2、 如果确实超过了30分钟没有支付，则取消订单
                    //a. 像微信支付平台发送请求，关闭当前订单的支付链接
                    Map<String, String> closeMap = wxPay.closeOrder(params);
                    //b.关闭订单
                    orderService.closeOrder(order.getOrderId());

                }
            }

        }catch(Exception e){
            e.printStackTrace();
        }



    }
}
